/*================================================================
*   Copyright (C) 2024 baichao All rights reserved.
*   
*   文件名称：execve_no_fork.c
*   创 建 者：baichao
*   创建日期：2024年04月05日
*   描    述：
*
================================================================*/

/*
 * 代码段最后的Never get here没有被打印出来，这是因为execve函数的返回是特殊的。
 * 如果失败，则会返回-1，但是如果成功，则永不返回，这是可以理解的。
 * execve做的就是斩断过去，奔向新生活的事情，如果成功，自然不可能再返回来，再次执行老程序的代码。
 * 所以无须检查execve的返回值，只要返回，就必然是-1。
 * 可以从errno判断出出错的原因。出错的可能性非常多，手册提供了19种不同的errno，罗列了22种失败的情景。
 * 很难记住，好在大部分都不常见，常见的情况有以下几种：
 *   ·EACCESS：这个是我们最容易想到的，就是第一个参数filename，不是个普通文件，或者该文件没有赋予可执行的权限，或者目录结构中某一级目录不可搜索，或者文件所在的文件系统是以MS_NOEXEC标志挂载的。
 *   ·ENOENT：文件不存在。
 *   ·ETXTBSY：存在其他进程尝试修改filename所指代的文件。
 *   ·ENOEXEC：这个错误其实是比较高端的一种错误了，文件存在，也可以执行，但是无法执行，比如说，Windows下的可执行程序，拿到Linux下，调用execve来执行，文件的格式不对，就会返回这种错误。
 */
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
    char *args[] = {"/bin/ls", "-l",NULL};
    if(execve("/bin/ls",args, NULL) == -1) {
        perror("execve");
        exit(EXIT_FAILURE);
    }
    puts("Never get here");
    exit(EXIT_SUCCESS);
}
